package net.jgrm.redisadvanced.service;

import java.util.concurrent.TimeUnit;

/**
 * Redis String类型操作服务接口
 */
public interface RedisStringService {

    /**
     * 设置字符串值
     *
     * @param key   键
     * @param value 值
     */
    void set(String key, Object value);

    /**
     * 设置字符串值并设置过期时间
     *
     * @param key        键
     * @param value      值
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     */
    void set(String key, Object value, long expireTime, TimeUnit timeUnit);

    /**
     * 获取字符串值
     *
     * @param key   键
     * @param clazz 返回值类型
     * @param <T>   返回值泛型
     * @return 值
     */
    <T> T get(String key, Class<T> clazz);

    /**
     * 设置键的值，仅当键不存在时才设置
     *
     * @param key   键
     * @param value 值
     * @return 设置是否成功
     */
    Boolean setIfAbsent(String key, Object value);

    /**
     * 设置键的值，仅当键不存在时才设置，并设置过期时间
     *
     * @param key        键
     * @param value      值
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 设置是否成功
     */
    Boolean setIfAbsent(String key, Object value, long expireTime, TimeUnit timeUnit);


    /**
     * 批量获取值
     *
     * @param keys  键数组
     * @param clazz 返回值类型
     * @param <T>   返回值泛型
     * @return 值数组
     */
    <T> T[] mGet(String[] keys, Class<T> clazz);

    /**
     * 自增操作
     *
     * @param key 键
     * @return 自增后的值
     */
    Long increment(String key);

    /**
     * 自增指定步长
     *
     * @param key   键
     * @param delta 步长
     * @return 自增后的值
     */
    Long increment(String key, long delta);

    /**
     * 自减操作
     *
     * @param key 键
     * @return 自减后的值
     */
    Long decrement(String key);

    /**
     * 自减指定步长
     *
     * @param key   键
     * @param delta 步长
     * @return 自减后的值
     */
    Long decrement(String key, long delta);

    /**
     * 获取字符串长度
     *
     * @param key 键
     * @return 字符串长度
     */
    Long size(String key);

    /**
     * 追加字符串
     *
     * @param key   键
     * @param value 要追加的字符串
     * @return 追加后的字符串长度
     */
    Integer append(String key, String value);
}